// es5
// let obj ={}
// let newVal=''
// Object.defineProperty(obj,'name',{
//     get(){
//         // console.log('get');
//         return newVal
//     },
//     set(val){
//         console.log('set');
//         newVal=val
//     }
// })

// obj.name='ws'
// console.log(obj.name);
// console.log(obj);


// proxy
// Proxy对象的所有用法，都是上面的这种形式。不同的只是handle参数的写法。其中new Proxy用来生成Proxy实例，target是表示所要拦截的对象，handle是用来定制拦截行为的对象。
// let obj={}
// let p = new Proxy(obj,{})
// p.name='zsb'
// console.log(obj.name);
// for (const key in obj) {
//    console.log(key);
// }

// get
// let arr=[7,8,9]
// arr=new Proxy(arr,{
//     get(target,prop){
//         console.log(target,prop);
//         return prop in target?target[prop]:'error'
//     }
// })
// console.log(arr[1]);

// let obj={
//     '你好':"hello",
//     '世界':"word"
// }
// obj=new Proxy(obj,{
//     get(target,prop){
//         console.log(target,prop);
//         return prop in target?target[prop]:prop
//     }
// })
// console.log(obj['你好']);

// set
// let arr=[]
// arr=new Proxy(arr,{
//     set(target,prop,val){
//         if(typeof val==='number'){
//             return  target[prop]=val
//         }else{
//             return false
//         }
//     }
// })
// console.log(arr.push(1));
// console.log(arr);



// has
// let range={
//     start:1,
//     end:5
// }
// range=new Proxy(range,{
//     has(target,prop){
//         return prop>=target.start&&prop<=target.end
//     }
// });
// console.log(2 in range);


// ownKeys
// let obj ={
//     name:'imooc',
//     [Symbol('es')]:'es6'
// }
// console.log(Object.getOwnPropertyNames(obj));
// console.log(Object.getOwnPropertySymbols(obj));
// console.log(Object.keys(obj));
// for(let key in obj){
//     console.log(key);
// }


//  let userinfo={
//      name:"zsb",
//      age:24,
//      _password:'**'
//  }
//  userinfo=new Proxy(userinfo,{
//      ownKeys(target){
//          return  Object.keys(target).filter(key=> !key.startsWith('_'))
//      }
//  })
//  for(let key in userinfo){
//      console.log(key);
//  }


//  let userinfo={
//      name:"zsb",
//      age:24,
//      _password:'**'
//  }

//  userinfo=new Proxy(userinfo,{
//      get(target,prop){
//         if (prop.startsWith('_')) {
//             throw new Error('不可访问')
//         }else{
//             return target[prop]
//         }
//      },
//      set(target,prop,val){
//          if (prop.startsWith('_')) {
//             throw new Error('不可访问')
//          }else{
//              target[prop]=val
//              return true
//          }
//      },
//      deleteProperty(target,prop){
//         //  拦截删除
//         if (prop.startsWith('_')) {
//             throw new Error('不可访问')
//          }else{
//             delete target[prop]
//              return true
//          }
//      }
//  })
//  console.log(userinfo._password);
// console.log(userinfo.age);
// userinfo.age=18
// delete userinfo.age
// console.log(userinfo.age);



// apply
// let sum=(...args)=>{
//     let num =0
//     args.forEach(item=>{
//         num+=item
//     })
//     return num
// }
// sum=new Proxy(sum,{
//     apply(target,ctx,args){
//         return target(...args)*2
//     }
// })
// console.log(sum(1,2));
// console.log(sum.call(null,1,3));
// console.log(sum.apply(null,[1,3]));

// construct  new
let User =class{
    constructor(name){
        this.name=name
    }
}
User=new Proxy(User,{
    construct(target,args,newTarget){
        return new target(...args)
    }
})
console.log(new User('imooc'));
